package model;
 // model 这个包里面的 都是和数据相关的 部分

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 言初
 * Date: 2024-04-09
 * Time: 20:10
 *
 * 通过这个类来封装 数据库的连接操作
 *
 */


public class DBUtil {
    // 这个类 中 要提供 DataSource 这个类，DataSource 对于一个项目来说，有一个就行了(单例)
    private static volatile  DataSource dataSource = null;

    // 保证线程安全的3点：
    // 1. 是给 dataSource 加上  volatile
    // 2. 是使用  synchronized 关键字加锁
    // 3. 使用双层的 if 判断（只在 必要的时候才去加锁）

    private static  DataSource getDataSource(){
        // 首次调用这个方法才会去创建这个 dataSource 这个实例
        // 通过这个方法 getDataSource，来对 dataSource 进行一个实例化

        if(dataSource==null){
            synchronized (DBUtil.class){
                //加锁，针对这个 DBUtil 类对象来进行加锁
                if(dataSource==null){
                    dataSource = new MysqlDataSource();

                    ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107_blog_system?characterEncoding=utf8&useSSL=false");
                    ((MysqlDataSource)dataSource).setUser("root");
                    ((MysqlDataSource)dataSource).setPassword("813818");
                }
            }
        }

        return dataSource;
    }

    // 建立连接
    public static Connection getConnection() throws SQLException {
        return  getDataSource().getConnection();
    }

    // 以后我们就可以使用  DBUtil.getConnection()  来建立数据库的连接了

    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
        // 关闭数据库的连接
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}











